package com.osdp.common.security.config;

import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.annotation.Bean;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

/**
 * https://www.jianshu.com/p/77b4835b6e8e
 *
 * EnableGlobalMethodSecurity 开启Spring方法级安全
 * @EnableWebSecurity
 * prePostEnabled = true  确定 前置注解[@PreAuthorize,@PostAuthorize,..] 是否启用。开启方法级别的权限谁,开启权限验证注解
 * securedEnabled = true, 确定安全注解 [@Secured] 是否启用。注解是用来定义业务方法的安全配置。在需要安全[角色/权限等]的方法上指定 @Secured，
 * 并且只有那些角色/权限的用户才可以调用该方法,@Secured缺点（限制）就是不支持Spring EL表达式。不够灵活。
 * 并且指定的角色必须以ROLE_开头，不可省略。
 * public interface UserService {
 *   List<User> findAllUsers();
 *
 *   @PreAuthorize("hasAnyRole('user')")
 *   void updateUser(User user);
 *
 *     // 下面不能设置两个注解，如果设置两个，只有其中一个生效
 *     // @PreAuthorize("hasAnyRole('user')")
 *   @Secured({ "ROLE_user", "ROLE_admin" })
 *   void deleteUser();
 * }
 * jsr250Enabled： 确定 JSR-250注解 [@RolesAllowed..]是否启用
 */
@EnableWebSecurity
@Configurable
@EnableGlobalMethodSecurity(securedEnabled = true,prePostEnabled = true)
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }
    /**
     资源权限配置（过滤器链）
     1. 拦截哪些资源
     2. 资源所对应的角色权限
     3. 定义认证方式 httpbasic  httpform
     4. 定制登录页面，登录请求地址，错误处理方式
     5. 自定义 springsecurity 过滤器等
     */
    @Override
    public void configure(WebSecurity web) {
        web.ignoring().antMatchers("/actuator/**", "/auth/**", "/oauthClient/**","/v1/rest/**","/druid/**");
        web.ignoring().antMatchers("/auth/actuator/**", "/auth/login/**", "/auth/oauthClient/**");
    }



}

